# language: zh-CN
# 需求ID: REQ-001, REQ-002
# SRS需求: 3.1 DSL解析与领域图, 3.2 两层转换架构, 3.11 模板系统与代码重用, 3.12 插件系统与扩展性
# Feature ID: Epic 1.2
# 用户故事: US-004, US-005
# 关联功能: 类型别名系统、参数化模板、跨字段验证、结构化命令事件、插件扩展
功能: 动态对象模型
  作为开发者
  我希望DSL v2.0能自动解析生成可导航的领域对象图
  以便通过"导航即访问"的方式操作数据并支持类型别名、参数化模板和插件扩展

  背景:
    假设我是一个使用动态对象模型的开发者
    并且我已经定义了包含关联关系的YAML DSL v2.0模型
    并且系统已经成功解析了模型定义
    并且模型包含类型别名、参数化模板和自定义验证规则
    并且系统已加载必要的插件和扩展

  # US-004: 作为开发者，我希望DSL能自动解析生成可导航的领域对象图
  场景: 自动生成可导航的领域对象图
    假设我使用YAML DSL v2.0语法从文件加载以下内容:
      """
      tests/cucumber/fixtures/entities/user-dsl.yml
      """
    当系统解析模型后
    那么应该生成可导航的对象图
    并且应该正确解析类型别名（Timestamp、UserStatus、Email）
    并且应该正确应用参数化模板（configurable_string、secure_password）
    并且我应该能够通过user.orders访问用户订单列表
    并且应该支持跨字段验证规则的运行时检查
    并且应该支持结构化的命令和事件对象
    并且应该正确处理模板继承和参数替换
    并且应该支持插件扩展的自定义字段类型

  场景: 类型别名系统的完整支持
    假设我定义了以下类型别名:
      """
      typeAliases:
        Email:
          type: string
          format: email
          maxLength: 255
        Timestamp:
          type: datetime
          auto: true
        UserStatus:
          type: enum
          values: [active, inactive, suspended, deleted]
        Money:
          type: decimal
          precision: 10
          scale: 2
          min: 0
      """
    当系统解析类型别名后
    那么应该正确创建类型别名映射
    并且应该支持类型别名的嵌套引用
    并且应该在实体字段中正确应用类型别名
    并且应该保持类型别名的验证规则
    并且应该支持类型别名的运行时类型检查

  场景: 参数化模板系统
    假设我定义了参数化模板:
      """
      templates:
        configurable_string:
          type: template
          parameters:
            - name: maxLength
              type: number
              default: 100
            - name: required
              type: boolean
              default: true
          definition:
            type: string
            maxLength: "{{maxLength}}"
            required: "{{required}}"
        
        secure_password:
          type: template
          parameters:
            - name: minLength
              type: number
              default: 8
          definition:
            type: string
            minLength: "{{minLength}}"
            pattern: "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]"
            encrypted: true
      """
    当我在实体中使用参数化模板:
      """
      entity:
        name: User
        attributes:
          username:
            template: configurable_string
            parameters:
              maxLength: 50
              required: true
          password:
            template: secure_password
            parameters:
              minLength: 12
      """
    那么应该正确展开模板参数
    并且应该应用参数化的验证规则
    并且应该支持模板的嵌套使用
    并且应该保持模板参数的类型安全

  场景: 导航即访问的数据加载
    假设我有一个用户对象实例
    当我访问user.orders属性
    那么系统应该自动加载相关的订单数据
    并且应该自动加载相关数据
    并且应该缓存已加载的数据避免重复查询
    并且应该正确处理类型别名字段的数据转换
    并且应该支持懒加载和预加载策略配置
    并且应该正确处理参数化模板字段的数据映射

  场景: 双向导航支持
    假设我有一个订单对象实例
    当我访问order.user属性
    那么系统应该自动加载关联的用户数据
    当我再访问user.orders属性
    那么应该包含当前订单对象
    并且应该保持对象引用的一致性
    并且应该正确处理参数化模板字段的验证
    并且应该支持循环引用的智能检测和处理

  场景: 增强的跨字段验证系统
    假设我定义了复杂的跨字段验证规则:
      """
      entity:
        name: User
        attributes:
          age:
            type: number
            min: 0
            max: 150
          email:
            type: Email  # 类型别名
          status:
            type: UserStatus  # 枚举类型别名
        
        crossFieldValidations:
          age_email_consistency:
            when: "age < 18"
            then:
              - field: email
                rule: pattern
                value: ".*@(school|edu)\\."
                message: "未成年用户必须使用教育邮箱"
          
          status_age_validation:
            when: "status == 'active'"
            then:
              - field: age
                rule: min
                value: 16
                message: "激活用户年龄不能小于16岁"
      """
    当我创建或更新用户对象时
    那么应该自动触发跨字段验证规则
    并且应该支持条件表达式的动态计算
    并且应该提供详细的验证错误信息
    并且应该支持多层嵌套的验证条件
    并且应该支持自定义验证器的插件扩展

  场景: 结构化命令和事件对象
    假设我定义了结构化的命令和事件:
      """
      commands:
        CreateUser:
          type: command
          aggregate: User
          attributes:
            userData:
              template: user_creation_template
            metadata:
              type: object
              attributes:
                requestId: string
                timestamp: Timestamp
                source: string
        
        UpdateUserStatus:
          type: command
          aggregate: User
          attributes:
            userId: string
            newStatus: UserStatus
            reason: string
      
      events:
        UserCreated:
          type: event
          aggregate: User
          attributes:
            userId: string
            userData: object
            timestamp: Timestamp
        
        UserStatusChanged:
          type: event
          aggregate: User
          attributes:
            userId: string
            oldStatus: UserStatus
            newStatus: UserStatus
            reason: string
            timestamp: Timestamp
      """
    当系统解析命令和事件定义后
    那么应该生成强类型的命令和事件对象
    并且应该支持命令的验证和事件的序列化
    并且应该正确处理类型别名和模板字段
    并且应该支持命令和事件的版本管理
    并且应该提供命令总线和事件总线的集成

  # US-005: 作为开发者，我希望能隐藏聚合实现细节
  场景: 隐藏聚合实现细节
    假设我需要操作用户聚合
    当我调用用户相关的业务方法
    那么我不需要了解底层的数据库操作
    并且我不需要手动管理事务边界
    并且我不需要处理对象关系映射的复杂性
    并且系统应该自动处理聚合根的完整性
    并且应该自动执行跨字段验证规则
    并且应该透明地处理类型别名和模板字段的转换

  场景: 支持复杂的导航路径
    假设我需要查询用户的所有订单项
    当我使用导航路径"user.orders"
    那么系统应该自动生成相应的查询
    并且应该返回正确的订单列表
    并且应该保持对象间的关联关系
    并且应该正确处理类型别名字段的查询条件
    并且应该支持深度导航路径如"user.orders.items.product"
    并且应该优化多层关联的查询性能

  场景: 循环引用处理
    假设模型中存在循环引用关系
    当我进行对象导航时
    那么系统应该检测并处理循环引用
    并且应该避免无限递归
    并且应该提供配置选项控制导航深度
    并且应该正确处理参数化模板的循环依赖
    并且应该支持弱引用和延迟加载策略
    并且应该提供循环引用的可视化诊断工具

  场景: 动态模型更新后的对象图重建
    假设我更新了DSL v2.0模型定义
    当系统重新解析模型后
    那么应该重建对象图结构
    并且现有的对象实例应该适配新的模型
    并且应该保持数据的一致性
    并且应该通知相关组件模型变更
    并且应该重新编译类型别名和参数化模板
    并且应该支持模型版本的向后兼容性
    并且应该提供模型迁移的回滚机制

  场景: 插件系统的动态扩展
    假设我需要扩展系统功能
    当我加载自定义插件:
      """
      plugins:
        customFieldTypes:
          - name: GeoLocation
            type: object
            attributes:
              latitude: number
              longitude: number
            rules:
              - rule: custom
                validator: validateGeoCoordinates
        
        customValidators:
          - name: validateGeoCoordinates
            function: |
              function(value) {
                return value.latitude >= -90 && value.latitude <= 90 &&
                       value.longitude >= -180 && value.longitude <= 180;
              }
        
        customTransformers:
          - name: geoDistanceCalculator
            input: [GeoLocation, GeoLocation]
            output: number
            function: |
              function(point1, point2) {
                // Haversine formula implementation
                return calculateDistance(point1, point2);
              }
      """
    那么系统应该动态加载插件
    并且应该注册自定义字段类型
    并且应该集成自定义验证器
    并且应该支持插件的热插拔
    并且应该提供插件的依赖管理
    并且应该确保插件的安全沙箱执行

  场景: 模板继承和组合
    假设我定义了模板继承关系:
      """
      templates:
        base_entity:
          type: template
          definition:
            attributes:
              id:
                type: string
                primary: true
                generated: uuid
              createdAt:
                type: Timestamp
              updatedAt:
                type: Timestamp
        
        auditable_entity:
          type: template
          extends: base_entity
          definition:
            attributes:
              createdBy:
                type: string
              updatedBy:
                type: string
              version:
                type: number
                default: 1
        
        user_entity:
          type: template
          extends: auditable_entity
          parameters:
            - name: includeProfile
              type: boolean
              default: false
          definition:
            attributes:
              name:
                template: configurable_string
              email:
                type: Email
              profile:
                when: "{{includeProfile}}"
                type: object
      """
    当我使用模板继承创建实体时
    那么应该正确合并继承链中的所有字段
    并且应该支持字段的覆盖和扩展
    并且应该处理条件字段的动态包含
    并且应该保持模板参数的作用域隔离
    并且应该支持多重继承和混入模式